<?php
/**
 * Page gestion des utilisateurs
 * Permet l'affichage, l'ajout, la suppression et la modification des utilisateurs
 *
 * @category actions
 * @package administration
 *
 * @author M.CASTANHEIRO, M.MEUNIER, O.PATTE, C.PORTEMER, R.THERY-HERMAIN
 * @version 1.0
 */
class userAction extends shAction {
    /**
     * Fonction appellée automatiquement pour toutes les requêtes de l'action
     */
    public function init() {
	$this->setTitle('Gestion des utilisateurs');
	$this->addAriane(shRequest::link('administration'), 'Administration');
    }

    /**
     * Execute la méthode par défaut pour l'action user
     */
    public function execute() {
	// Récupération des utilisateurs existants
	$users = shSGBD::select ('SELECT user.id, user.identifiant, user.email '.
				   'FROM user '.
				   'ORDER BY user.identifiant ');
	$this->assign('users', $users);
    }

    /**
     * Ajouter un utilisateur
     */
    public function executeCreate() {
	$this->setTitle('Ajout d\'un utilisateur');
	$this->addAriane(shRequest::link('administration', 'user'), 'Gestion des utilisateurs');

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Ajouter l\'utilisateur');

	shField::text('Identifiant')
	    ->setHelper('Chaîne alphanumérique')
	    ->appendTo($formulaire);

	shField::email('Adresse e-mail')
	    ->setRequired(false)
	    ->appendTo($formulaire);

	shField::text('Mot de passe')
	    ->setValue(randomString(5))
	    ->appendTo($formulaire);

	$multibox_access = shField::multibox('Profils d\'accès')
	    ->appendTo($formulaire);

	$profils = shSGBD::select(
	    'SELECT profil.id, profil.intitule '.
	    'FROM profil '.
	    'ORDER BY profil.intitule '
	);

	foreach ($profils AS $profil) {
	    $multibox_access->addOption($profil->id, $profil->intitule);
	}

	$formulaire->setCheck(function($formulaire) {
	    if ( !$formulaire->getField('Identifiant')->isError() ) {
		if ( shSGBD::count('SELECT COUNT(id) '.
				   'FROM user '.
				   'WHERE identifiant=?',
				    array($formulaire->getField('Identifiant')->getValue())) > 0 )
		{
		    $formulaire->getField('Identifiant')->setError('L\'identifiant existe déjà');
		}
	    }
	});

	$formulaire->setSubmit(function($formulaire) {
	    // Insertion de l'utilisateur
	    $id_user = shSGBD::insert(
		'INSERT INTO user(identifiant, email, motdepasse) '.
		'VALUES(:identifiant, :email, :motdepasse) ',
		array(':identifiant' => $formulaire->getField('Identifiant')->getValue(),
		      ':email' => $formulaire->getField('Adresse e-mail')->getValue(),
		      ':motdepasse' => sha1($formulaire->getField('Mot de passe')->getValue()) )
	    );

	    // Insertion des profils utilisateur
	    foreach ( $formulaire->getField('Profils d\'accès')->getValue() AS $profil ) {
		shSGBD::insert(
		    'INSERT INTO profil_user(id_profil, id_user) '.
		    'VALUES(:id_profil, :id_user) ',
		    array(':id_profil' => $profil, ':id_user' => $id_user)
		);
	    }

	    $formulaire->setConfirmation(
		'L\'utilisateur '.$formulaire->getField('Identifiant')->getValue() .' a été ajouté. '.
		'Le mot de passe de cet utilisateur est <strong>'.$formulaire->getField('Mot de passe')->getValue().'</strong>, merci de le lui transmettre.'
	    );
	});

	$this->assign('formulaire', $formulaire);	
    }

    /**
     * Modification d'un utilisateur
     * @param <integer> Identifiant de l'utilisateur à modifier
     */
    public function executeEdit($id_user) {
	$this->setTitle('Modification d\'un utilisateur');
	$this->addAriane(shRequest::link('administration', 'user'), 'Gestion des utilisateurs');

	if ( !($user = shSGBD::selectOne(
	    'SELECT user.id, user.identifiant, user.email '.
	    'FROM user '.
	    'WHERE id=? ',
	    array($id_user)
	)) ) {
	    throw new Exception('Utilisateur inconnu');
	    return false;
	}

	$formulaire = new shFormulaire;
	$formulaire->setSubmitText('Modifier l\'utilisateur');

	shField::text('Identifiant')
	    ->setHelper('Chaîne alphanumérique')
	    ->setValue($user->identifiant)
	    ->appendTo($formulaire);

	shField::email('Adresse e-mail')
	    ->setValue($user->email)
	    ->setRequired(false)
	    ->appendTo($formulaire);

	shField::text('Mot de passe')
	    ->setRequired(false)
	    ->setHelper('Seulement pour le changer')
	    ->appendTo($formulaire);

	$multibox_access = shField::multibox('Profils d\'accès')
	    ->appendTo($formulaire);

	// Charge tous les profils
	$profils = shSGBD::select(
	    'SELECT profil.id, profil.intitule '.
	    'FROM profil '.
	    'ORDER BY profil.intitule '
	);

	foreach ($profils AS $profil) {
	    $multibox_access->addOption($profil->id, $profil->intitule);
	}

	// Charge les profils de l'user
	$profils = shSGBD::select(
	    'SELECT profil.id, profil.intitule '.
	    'FROM profil '.
	    'INNER JOIN profil_user ON profil.id=profil_user.id_profil '.
	    'WHERE profil_user.id_user=? '.
	    'ORDER BY profil.intitule ',
	    array($user->id)
	);

	$droits = array();
	foreach ($profils AS $profil) {
	    $droits[] = $profil->id;
	}
	$multibox_access->setValue($droits);

	$formulaire->setCheck(function($formulaire) use($user) {
	    if ( !$formulaire->getField('Identifiant')->isError() ) {
		if ( shSGBD::count('SELECT COUNT(id) '.
				   'FROM user '.
				   'WHERE identifiant=:identifiant '.
				   'AND id!=:id ',
				    array(':identifiant' => $formulaire->getField('Identifiant')->getValue(),
					  ':id' => $user->id)) > 0 )
		{
		    $formulaire->getField('Identifiant')->setError('L\'identifiant existe déjà');
		}
	    }
	});

	$formulaire->setSubmit(function($formulaire) use($user) {
	    // Mise à jour de l'utilisateur
	    shSGBD::update(
		'UPDATE user SET identifiant=:identifiant, email=:email '.
		'WHERE id=:id ',
		array(':identifiant' => $formulaire->getField('Identifiant')->getValue(),
		      ':email' => $formulaire->getField('Adresse e-mail')->getValue(),
		      ':id' => $user->id
		     )
	    );

	    // Mot de passe modifié
	    if ( $formulaire->getField('Mot de passe')->getValue() != '' ) {
		shSGBD::update(
		    'UPDATE user SET motdepasse=:motdepasse '.
		    'WHERE id=:id ',
		    array(':motdepasse' => sha1($formulaire->getField('Mot de passe')->getValue()),
			  ':id' => $user->id
			 )
		);
	    }

	    
	    // Suppression des profils utilisateur
	    shSGBD::delete(
		'DELETE FROM profil_user '.
		'WHERE id_user=? ',
		array($user->id)
	    );

	    // Insertion 
	    foreach ( $formulaire->getField('Profils d\'accès')->getValue() AS $profil ) {
		shSGBD::insert(
		    'INSERT INTO profil_user(id_profil, id_user) '.
		    'VALUES(:id_profil, :id_user) ',
		    array(':id_profil' => $profil, ':id_user' => $user->id)
		);
	    }

	    $formulaire->setConfirmation('L\'utilisateur '.$formulaire->getField('Identifiant')->getValue() .' a été modifié.');
	});
	
	$this->assign('formulaire', $formulaire);
    }

    /**
     * Suppression d'un utilisateur
     * @param <integer> Identifiant de l'utilisateur à supprimer
     */
    public function executeDelete($id_user) {
	$this->setTitle('Suppression d\'un utilisateur');
	$this->addAriane(shRequest::link('administration', 'user'), 'Gestion des utilisateurs');

	// Suppression des responsabilités dans la table responsable
	shSGBD::delete(
	    'DELETE FROM responsable '.
	    'WHERE id_user=?',
	    array($id_user)
	);

	// Suppression de l'utilisateur
	shSGBD::delete(
	    'DELETE FROM user '.
	    'WHERE id=?',
	    array($id_user)
	);

	// Redirection
	shAction::redirect('administration', 'user');
    }

}
?>